1 REM SOLVE THE MANSION MURDER--DISPLAY 2 REM 7 REM 8 REM RELOCATE BASIC VARIABLE STORAGE 9 REM 10 POKE 32766,PEEK(45):POKE 32767,PEEK(46):POKE 45,0:POKE 46,128 12 REM 13 REM HAS SCREEN BEEN LOADED? 14 REM 15 IF PEEK(31744)=26 AND PEEK(31748)=152 THEN 20 16 POKE 47,0:POKE 48,128:POKE 49,0:POKE 50,128:GOSUB 50000 20 GOSUB 1000 27 REM 28 REM MOVE VIDEO MEMORY TO MANSION 29 REM 30 WQ=PEEK(56578):XQ=PEEK(56576):POKE 56578,WQ OR 3:POKE 56576,XQ AND 272 OR VM 35 POKE VR,DM(0):POKE BR,DB(0):P=0:T=0 40 GOSUB 450 45 GOSUB 400:I=FRE(9) 97 REM 98 REM MOVEMENT LOOP 99 REM 100 VD=VM(PEEK(197)):HD=HM(PEEK(653)):IF HD=0 AND VD=0 THEN 100 102 REM 103 REM SPECIAL COMMAND HANDLER 104 REM 105 IF VD=2 THEN T=75:GOTO 180 106 IF VD=3 THEN 800 107 REM 108 REM CHECK WHERE FIGURE WILL BE 109 REM 110 V(P)=V(P)+VD:H(P)=H(P)+HD 111 XC(P)=PEEK(DA(PW(P))+H(P)+40*V(P))-128 112 REM 113 REM IS IT A SECRET PASSAGE? 114 REM 115 IF XC(P)>85 THEN 600 117 REM 118 REM IS IT A STAIR-END? 119 REM 120 IF (XC(P)=62 OR XC(P)=63) AND PR(P)=1 THEN 300 122 REM 123 REM CAN OBJECT BE MOVED THROUGH? 124 REM 125 IF XC(P)>61 OR XC(P)=0 THEN V(P)=XV(P):H(P)=XH(P):XC(P)=PR(P):GOTO 100 126 IF V(P)>22 OR V(P)<1 THEN 250 127 REM 128 REM MOVING OFF THE EDGE? 129 REM 130 IF H(P)>38 OR H(P)<1 THEN 200 131 IF V(P)>22 OR V(P)<1 THEN 250 137 REM 138 REM PUT BACK OLD FLOOR,GET NEW 139 REM 140 PRINT V$(XV(P))TAB(XH(P))XC$(P);:XC$(P)=CH$(XC(P)) 142 REM 143 REM PUT FIGURE IN NEW SPOT 144 REM 145 PRINT V$(V(P))TAB(H(P))PF$(P); 167 REM 168 REM IF NEW ROOM, PRINT NAME 169 REM 170 IF PR(P)<>XC(P) THEN GOSUB 460 177 REM 178 REM IS PLAYER'S TURN OVER? 179 REM 180 T=T+1:IF T>75 THEN GOSUB 500 190 XH(P)=H(P):XV(P)=V(P):GOTO 100 197 REM 198 REM HORIZONTAL MOVE TO NEW SCREEN 199 REM 200 PQ=3:IF H(P)<1 THEN PQ=4 205 IF PW(P)=W(PW(P),PQ) THEN H(P)=XH(P):V(P)=XV(P):GOTO 100 210 IF H(P)<1 AND PW(P)=4 THEN V(P)=6 211 IF H(P)>38 AND PW(P)=5 THEN V(P)=16 215 IF H(P)<1 THEN H(P)=38:GOTO 270 220 H(P)=1:GOTO 270 247 REM 248 REM VERTICAL MOVE TO NEW SCREEN 249 REM 250 PQ=2:IF V(P)<1 THEN PQ=1 255 IF PW(P)=W(PW(P),PQ) THEN H(P)=XH(P):V(P)=XV(P):GOTO 100 260 IF V(P)<1 THEN V(P)=22:GOTO 270 265 V(P)=1:GOTO 270 267 REM 268 REM GET NEW SCREEN NUMBER 269 REM 270 PW(P)=W(PW(P),PQ) 277 REM 278 REM GO INITIALIZE SCREEN 279 REM 280 GOSUB 900 290 GOTO 190 297 REM 298 REM STAIRWAY HANDLER 299 REM 300 IF PW(P)=11 THEN PW(P)=6:V(P)=7:H(P)=17:GOSUB 900:GOTO 190 310 IF PW(P)=8 AND XH(P)>12 THEN PW(P)=0:V(P)=14:H(P)=16:GOSUB 900:GOTO 190 315 IF PW(P)=8 THEN PW(P)=2:V(P)=21:H(P)=9:GOSUB 900:GOTO 190 320 IF PW(P)=7 THEN PW(P)=1:V(P)=3:H(P)=23:GOSUB 900:GOTO 190 330 IF PW(P)=6 THEN PW(P)=11:V(P)=19:H(P)=16:GOSUB 900:GOTO 190 340 IF PW(P)=5 THEN PW(P)=1:V(P)=15:H(P)=23:GOSUB 900:GOTO 190 350 IF PW(P)=4 THEN PW(P)=2:V(P)=20:H(P)=16:GOSUB 900:GOTO 190 360 IF PW(P)=2 AND XH(P)>12 THEN PW(P)=4:V(P)=10:H(P)=15:GOSUB 900:GOTO 190 365 IF PW(P)=2 THEN PW(P)=8:V(P)=21:H(P)=7:GOSUB 900:GOTO 190 370 IF PW(P)=1 AND XV(P)>9 THEN PW(P)=5:V(P)=3:H(P)=23:GOSUB 900:GOTO 190 375 IF PW(P)=1 THEN PW(P)=7:V(P)=16:H(P)=23:GOSUB 900:GOTO 190 380 IF PW(P)=0 THEN PW(P)=8:V(P)=20:H(P)=16:GOSUB 900:GOTO 190 390 H(P)=XH(P):V(P)=XV(P):GOTO 100 397 REM 398 REM UN-LINK SCREEN LINES 399 REM 400 FOR I=217 TO 242:POKE I,PEEK(I)OR 128:NEXT:RETURN 447 REM 448 REM RE-PRINT FIGURES ON SCREEN 449 REM 450 FOR I=0 TO NP:IF PW(I)=PW(P) THEN PRINT V$(V(I))TAB(H(I))PF$(I); 455 NEXT 460 PR(P)=XC(P):PRINT "[146]"V$(24)BL$V$(24)NM$(PR(P))V$(24)TAB(27)"PLAYER "P+1""; 465 RETURN 497 REM 498 REM CHANGE PLAYERS 499 REM 500 T=0:P=P+1:IF P>NP THEN P=0 505 POKE BR,YQ:PRINT "[147]":GOSUB 400 510 POKE BR,DB(PW(P)):POKE VR,DM(PW(P)):PRINT V$(24)BL$; 520 PRINT V$(24)"[146]"NM$(PR(P))V$(24)TAB(28)"PLAYER "P+1""; 530 FOR I=0 TO 2000:NEXT:POKE 197,64:POKE 653,0 540 GOSUB 450:RETURN 597 REM 598 REM MOVE THROUGH SECRET PASSAGES 599 REM 600 IF PW(P)=3 THEN PW(P)=10:V(P)=5:H(P)=14:GOSUB 900:GOTO 190 601 IF PW(P)=10 AND H(P)<18 THEN PW(P)=3:V(P)=22:H(P)=29:GOSUB 900:GOTO 190 602 IF PW(P)=6 THEN PW(P)=5:V(P)=10:H(P)=20:GOSUB 900:GOTO 190 603 IF PW(P)=5 AND XH(P)<22 THEN PW(P)=6:V(P)=3:H(P)=14:GOSUB 900:GOTO 190 604 IF PW(P)=5 AND V(P)<4 THEN PW(P)=8:V(P)=7:H(P)=5:GOSUB 900:GOTO 190 605 IF PW(P)=8 AND XV(P)=6 THEN PW(P)=5:V(P)=2:H(P)=37:GOSUB 900:GOTO 190 610 ON SP GOTO 620,670,720 615 V(P)=XV(P):H(P)=XH(P):GOTO 100 620 IF PW(P)=11 AND PR(P)=52 THEN PW(P)=8:V(P)=22:H(P)=3:GOSUB 900:GOTO 190 621 IF PW(P)=11 THEN PW(P)=11:H(P)=21:GOSUB 900:GOTO 190 622 IF PW(P)=9 AND PR(P)=4 THEN PW(P)=4:V(P)=8:H(P)=2:GOSUB 900:GOTO 190 623 IF PW(P)=10 AND PR(P)=4 THEN PW(P)=1:V(P)=13:H(P)=28:GOSUB 900:GOTO 190 624 IF PW(P)=4 THEN PW(P)=11:V(P)=8:H(P)=3:GOSUB 900:GOTO 190 625 IF PW(P)=9 THEN PW(P)=5:V(P)=9:H(P)=36:GOSUB 900:GOTO 190 626 IF PW(P)=7 THEN PW(P)=10:V(P)=6:H(P)=38:GOSUB 900:GOTO 190 627 IF PW(P)=10 THEN PW(P)=11:V(P)=6:H(P)=31:GOSUB 900:GOTO 190 628 IF PW(P)=5 AND XH(P)>32 THEN PW(P)=7:V(P)=6:H(P)=8:GOSUB 900:GOTO 190 629 IF PW(P)=1 THEN PW(P)=9:V(P)=16:H(P)=25:GOSUB 900:GOTO 190 630 IF PW(P)=8 AND PR(P)=41 THEN PW(P)=3:V(P)=5:H(P)=7:GOSUB 900:GOTO 190 650 V(P)=XV(P):H(P)=XH(P):GOTO 100 670 IF PW(P)=11 AND PR(P)=52 THEN PW(P)=9:V(P)=2:H(P)=2:GOSUB 900:GOTO 190 671 IF PW(P)=11 THEN PW(P)=11:H(P)=21:GOSUB 900:GOTO 190 672 IF PW(P)=9 AND PR(P)=4 THEN V(P)=13:GOSUB 900:GOTO 190 673 IF PW(P)=10 AND PR(P)=4 THEN PW(P)=5:V(P)=9:H(P)=37:GOSUB 900:GOTO 190 674 IF PW(P)=4 THEN PW(P)=10:V(P)=17:H(P)=12:GOSUB 900:GOTO 190 675 IF PW(P)=9 THEN PW(P)=0:V(P)=5:H(P)=16:GOSUB 900:GOTO 190 676 IF PW(P)=7 THEN PW(P)=1:V(P)=12:H(P)=27:GOSUB 900:GOTO 190 677 IF PW(P)=10 THEN PW(P)=8:V(P)=17:H(P)=2:GOSUB 900:GOTO 190 678 IF PW(P)=5 AND XH(P)>32 THEN PW(P)=11:V(P)=22:H(P)=27:GOSUB 900:GOTO 190 679 IF PW(P)=1 THEN PW(P)=7:V(P)=6:H(P)=12:GOSUB 900:GOTO 190 680 IF PW(P)=8 AND PR(P)=41 THEN PW(P)=7:V(P)=2:H(P)=27:GOSUB 900:GOTO 190 700 V(P)=XV(P):H(P)=XH(P):GOTO 100 720 IF PW(P)=11 AND PR(P)=52 THEN PW(P)=5:V(P)=9:H(P)=37:GOSUB 900:GOTO 190 721 IF PW(P)=11 THEN PW(P)=11:H(P)=21:GOSUB 900:GOTO 190 722 IF PW(P)=9 AND PR(P)=4 THEN PW(P)=7:V(P)=6:H(P)=12:GOSUB 900:GOTO 190 723 IF PW(P)=10 AND PR(P)=4 THEN V(P)=6:GOSUB 900:GOTO 190 724 IF PW(P)=4 THEN PW(P)=9:V(P)=2:H(P)=27:GOSUB 900:GOTO 190 725 IF PW(P)=9 THEN PW(P)=8:V(P)=10:H(P)=15:GOSUB 900:GOTO 190 726 IF PW(P)=7 THEN PW(P)=10:V(P)=2:H(P)=12:GOSUB 900:GOTO 190 727 IF PW(P)=10 THEN PW(P)=9:V(P)=17:H(P)=2:GOSUB 900:GOTO 190 728 IF PW(P)=5 AND XH(P)>32 THEN PW(P)=8:V(P)=18:H(P)=3:GOSUB 900:GOTO 190 729 IF PW(P)=1 THEN PW(P)=4:V(P)=7:H(P)=2:GOSUB 900:GOTO 190 730 IF PW(P)=8 AND PR(P)=41 THEN PW(P)=11:V(P)=22:H(P)=21:GOSUB 900:GOTO 190 750 V(P)=XV(P):H(P)=XH(P):GOTO 100 797 REM 798 REM ENDING ROUTINE 799 REM 800 POKE BR,YQ:PRINT "[147]DO YOU WANT TO END THIS GAME? (Y OR N)" 805 POKE VR,ZQ:POKE 56578,PEEK(56578)OR 3:POKE 56576,XQ 810 FOR I=0 TO 2000:NEXT:POKE 198,0:POKE 197,64 820 VD=PEEK(197):IF VD=64 THEN 820 825 IF VD=25 THEN 850 830 WQ=PEEK(56578):XQ=PEEK(56576):POKE 56578,WQ OR 3:POKE 56576,XQ AND 272 OR VM 835 POKE VR,DM(PW(P)):POKE BR,DB(PW(P)) 840 GOSUB 450 845 GOTO 190 850 PRINT "DO YOU WANT TO START A NEW GAME? (Y OR N)" 855 FOR I=0 TO NP:POKE BR,DB(PW(I)):PRINT V$(XV(I))TAB(XH(I))""XC$(I);:NEXT 860 POKE BR,YQ 865 FOR I=0 TO 2000:NEXT:POKE 198,0:POKE 197,64 870 VD=PEEK(197):IF VD=64 OR (VD<>25 AND VD<>39) THEN 870 875 IF VD=25 THEN GOSUB 1120:GOTO 30 890 POKE 31744,UQ:POKE 31748,VQ:POKE 45,PEEK(31744):POKE 46,PEEK(31748) 895 POKE 792,71:POKE 808,237:PRINT "[147]THANKS FOR PLAYING!":CLR:END 897 REM 898 REM INITIALIZE NEW SCREEN 899 REM 900 PRINT V$(XV(P))TAB(XH(P))XC$(P); 902 REM 903 REM RESET COLOR MEMORY 904 REM 905 POKE BR,YQ:PRINT "[147]":GOSUB 400 907 REM 908 REM GET TO NEW SCREEN 909 REM 910 POKE VR,DM(PW(P)):POKE BR,DB(PW(P)) 912 REM 913 REM GET NEW FLOOR 914 REM 915 XC(P)=PEEK(DA(PW(P))+H(P)+40*V(P))-128:IF XC(P)>0 AND XC(P)<62 THEN 930 920 H(P)=H(P)+1+38*(H(P)>37):V(P)=V(P)+1+22*(V(P)>21):GOTO 915 930 XC$(P)=CH$(XC(P)):GOSUB 450:RETURN 997 REM 998 REM SET UP TABLES 999 REM 1000 DIM W(11,6),HM(7),VM(64),MT(2,2),V$(24),CH$(63),NM$(63) 1005 DIM V(5),SH(5),H(5),XH(5),XV(5),PW(5),XC(5),PR(5),PF$(5),XC$(5) 1007 REM 1008 REM VERTICAL KEYSTROKE TABLE 1009 REM 1010 FOR I=0 TO 64:VM(I)=0:NEXT:VM(6)=-1:VM(3)=1:VM(1)=3:VM(60)=2 1017 REM 1018 REM HORIZONTAL KEYSTROKE TABLE 1019 REM 1020 FOR I=0 TO 7:HM(I)=0:NEXT:HM(1)=1:HM(2)=-1:HM(3)=-1 1027 REM 1028 REM VERTICAL PRINT TABLE 1029 REM 1030 V$(0)="":FOR I=1 TO 24:V$(I)=V$(I-1)+"":NEXT 1047 REM 1048 REM WING TABLE 1049 REM 1050 FOR I=0 TO 11:FOR K=0 TO 4:READ A:W(I,K)=A:NEXT:NEXT 1060 DATA 0,2,0,0,1 1061 DATA 1,3,1,0,1 1062 DATA 2,2,0,2,3 1063 DATA 3,3,1,2,3 1064 DATA 4,4,4,4,5 1065 DATA 5,5,5,4,5 1066 DATA 6,8,6,6,7 1067 DATA 7,7,7,6,7 1068 DATA 8,8,6,8,8 1069 DATA 9,11,9,9,10 1070 DATA 10,10,10,9,10 1071 DATA 11,11,9,11,11 1072 REM 1073 REM SCREEN CODE/ASCII CONVERSION 1074 REM 1075 FOR I=0 TO 31:CH$(I)=CHR$(I+64):NEXT:FOR I=32 TO 63:CH$(I)=CHR$(I):NEXT 1076 FOR I=0 TO 63:CH$(I)=""+CH$(I)+"[146]":NEXT 1077 REM 1078 REM ROOM NAME TABLE 1079 REM 1080 FOR I=1 TO 52:READ A$:NM$(I)=A$:NEXT:FOR I=53 TO 61:NM$(I)="DOORWAY":NEXT 1081 NM$(62)=NM$(1):NM$(63)=NM$(1) 1082 DATA "STAIRWAY","WATER CLOSET","CLOSET","CRAWL SPACE","PORTICO","PORCH" 1083 DATA "LAWN","BALCONY","HALLWAY","PARLOR","DINING ROOM","CONSERVATORY" 1084 DATA "KITCHEN","LAUNDRY","PANTRY","FAMILY PARLOR","BALL ROOM","STUDY" 1085 DATA "LIBRARY","TEA GARDEN","GREENHOUSE","DECK","HOT TUB","GARAGE" 1086 DATA "BILLIARD ROOM","DEN","WORKSHOP","FURNACE ROOM","CHAUFFER'S ROOM" 1087 DATA "MAID'S ROOM","BUTLER'S ROOM","SAUNA","TAPESTRY ROOM"," " 1088 DATA "WYETH ROOM","NURSERY","PICASSO ROOM","VERMEER ROOM","DRESSING ROOM" 1089 DATA "VAN GOGH ROOM","LIBRARY BALCONY","COMPUTER ROOM","TRAIN ROOM" 1090 DATA "PLAY ROOM","FREDDY'S ROOM","CECIL'S ROOM","AMY'S ROOM" 1091 DATA "GOVERNESS'S CUPBOARD","SCHOOL ROOM","STUDIO","HIGH BALCONY" 1092 DATA "SECRET ROOM" 1097 REM 1098 REM SET INITIAL VALUES 1099 REM 1100 FOR I=0 TO 5:PF$(I)="@[146][149]":NEXT:FOR I=0 TO 5:READ A$:PF$(I)=A$+PF$(I):NEXT 1105 DATA "[129]","[151]","","[154]","","[155]" 1110 BL$=" " 1115 FOR I=0 TO 5:READ A:SH(I)=A:NEXT 1116 DATA 5,9,13,17,21,25 1120 FOR I=0 TO 5:H(I)=SH(I):V(I)=15:PW(I)=0:XH(I)=H(I):XV(I)=V(I):NEXT 1125 FOR I=0 TO 5:XC(I)=PEEK(DA(PW(I))+H(I)+40*V(I))-128:XC$(I)=CH$(XC(I)):NEXT 1127 REM 1128 REM GET PLAYER NUMBER 1129 REM 1130 PRINT V$(24)"HOW MANY PLAYERS? (1-6) ";:POKE 197,64:POKE 198,0 1135 GET A$:IF A$="" THEN 1135 1140 IF ASC(A$)<49 OR ASC(A$)>54 THEN 1135 1145 NP=VAL(A$)-1:PRINT V$(24)BL$V$(24)NP+1" PLAYERS--IS THIS RIGHT? (Y OR N)"; 1150 POKE 197,64:POKE 198,0 1155 GET A$:IF A$="" THEN 1155 1160 IF A$<>"Y" THEN 1130 1170 SP=1+INT(3*RND(9)):IF SP<1 OR SP>3 THEN 170 1180 POKE 792,193:POKE 808,239 1185 FOR I=23 TO 0 STEP-1:PRINT V$(I)TAB(39)"!";:NEXT 1190 RETURN 49997 REM 49998 REM SET UP DISPLAY 49999 REM 50000 DIM DB(11),DM(11),DA(11):POKE 53281,7:POKE 53280,11:POKE 657,128 50005 UQ=PEEK(32766):VQ=PEEK(32767) 50007 REM 50008 REM SET UP COLOR MEMORY 50009 REM 50010 PRINT "[149][147]";:FOR I=0 TO 23:PRINT"PLEASE FIND THE MURDERER IN THE MANSION" 50020 NEXT 50027 REM 50028 REM SET VIDEO MEM & CHAR MEM 50029 REM 50030 VM=2:VB=16384:CM=14:CB=VB+CM*1024:FOR I=0 TO 11:DM(I)=CM+16*(I+2):NEXT 50040 VR=53272:ZQ=PEEK(VR) 50047 REM 50048 REM SET BASIC POINTERS 50049 REM 50050 FOR I=0 TO 11:DB(I)=INT((VB+1024*(I+2))/256):NEXT 50055 FOR I=0 TO 11:DA(I)=DB(I)*256:NEXT 50060 BR=648:YQ=PEEK(BR) 50067 REM 50068 REM GET OLD VIDEO POINTERS 50069 REM 50070 WQ=PEEK(56578):XQ=PEEK(56576) 50077 REM 50078 REM SET LOAD FLAG 50079 REM 50080 Q9=Q8 50088 REM GET SCREEN DISPLAY & CHAR SET 50089 REM 50090 LOAD "DISPLAY DATA",8,1 50093 REM 50094 REM NOTE: LOADING SENDS PROGRAM BACK TO BEGINNING 50095 REM 50099 REM